package org.p2psimulator.entity;

import org.p2psimulator.util.SystemLogger;

/**
 * Abstra��o de um id do sistema
 * Um Id � uma identifica��o �nica utilizada pelo sistema
 * A raz�o para ele ser generico � que o tipo de valor para
 * a identifica��o poder� mudar de acordo com as necessidades
 * da simula��o.
 * Por exemplo, identificadores de peers hora podem ser
 * inteiros simples, hora podem ser endere�os IP ou mesmo
 * pares IP porta.
 * A maioria das classes de simula��o que usam a identifica��o n�o precisam
 * saber como ela est� sendo implementada. Para elas, basta a no��o de que
 * um Id � �nico, al�m de algumas funcionalidades de compara��o e hashCode.
 * Os tipos de implementa��o de Ids s�o determinados pelas
 * classes filhas.
 * Outro ponto importante � que, embora os ids sejam gerados pelo padr�o Factory,
 * for�ando partes do sistema com o mesmo dom�nio recorrerem a uma mesma f�brica
 * de Ids espec�fica e garantindo assim uma unicidade entre elas, f�bricas de ids diferentes
 * podem ser criadas para cada subsistema espec�fico. Assim, PeerIdFactory pode criar
 * ids para Peer baseados em pares IP:PORTA, enquanto uma FileIdFactory pode
 * criar ids para arquivos baseado em identifica��o de chaves inteiras
 *
 * @author Amorim
 *
 * @param <T>
 */
public abstract class Id <T> {

	protected T value;

	public Id(T value) {
		super();
		this.value = value;
	}

	public T getValue(){
		return value;
	}

	public void setValue(T value){
		this.value = value;
	}

	public void finalize(){
//		SystemLogger.logger.info("(GC) Id coletado: " + this.getClass().getName());
	}

	public String toString(){
		return "" + value;
	}
	
	public boolean isEqual (Id<T> id){
		return value == id.getValue();
		
	}
}
